import VueI18n, { messages } from '@/i18n'

const messagesConst = messages[VueI18n.locale]
export const validate = {}
/* 是否合法IP地址 */
validate.validateIP = function (rule, value, callback) {
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    if ((!reg.test(value)) && value !== '') {
      callback(new Error(messagesConst.validate.validateIP))
    } else {
      callback()
    }
  }
}
/* 是否邮编 */
validate.validateZipCode = function (rule, value, callback) {
  const reg = /^[0-9]{6}$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error(messagesConst.validate.validateZipCode))
    } else {
      callback()
    }
  }
}
/* 是否手机号码或者固话 */
validate.validatePhoneTwo = function (rule, value, callback) {
  const reg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error(messagesConst.validate.validatePhoneTwo))
    } else {
      callback()
    }
  }
}
/* 是否固话 */
validate.validateTelphone = function (rule, value, callback) {
  const reg = /0\d{2}-\d{7,8}/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error(messagesConst.validate.validateTelphone))
    } else {
      callback()
    }
  }
}
/* 是否身份证号码 */
validate.validateIdNo = function (rule, value, callback) {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error(messagesConst.validate.validateIdNo))
    } else {
      callback()
    }
  }
}
/* 是否邮箱 */
validate.validateEMail = function (rule, value, callback) {
  const reg = /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((\.+[a-zA-Z0-9_-]{2,64}){1,3})$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value)) {
      callback(new Error(messagesConst.validate.validateEMail))
    } else {
      callback()
    }
  }
}
/* 合法uri */
validate.validateURL = function (textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

/* 验证内容是否英文数字以及下划线 */
validate.isPassword = function (rule, value, callback) {
  const reg = /[a-zA-Z]/
  const reg2 = /[0-9]/
  const reg3 = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？ ]")
  for (let i = 0; i < value.length; i++) {
    if (value[i] === ' ') {
      callback(new Error(messagesConst.validate.isPassword))
    }
  }
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value) || !reg2.test(value) || value.length > 15 || value.length < 8 || !reg3.test(value)) {
      callback(new Error(messagesConst.validate.isPassword))
    } else {
      callback()
    }
  }
}

/* iam 验证内容是否英文数字以及下划线 */
validate.isPasswordIam = function (rule, value, callback) {
  const reg = /[a-z]/
  const reg4 = /[A-Z]/
  const reg2 = /[0-9]/
  const reg3 = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？ ]")
  for (let i = 0; i < value.length; i++) {
    if (value[i] === ' ') {
      callback(new Error(messagesConst.validate.isPasswordIam))
    }
  }
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value) || !reg2.test(value) || value.length > 30 || value.length < 10 || !reg3.test(value) || !reg4.test(value)) {
      callback(new Error(messagesConst.validate.isPasswordIam))
    } else {
      callback()
    }
  }
}

/* 验证内容是否英文及数字 */
validate.isNumOrEn = function (rule, value, callback) {
  const reg = /^[a-zA-Z0-9]{0,20}$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value)) {
      callback(new Error(messagesConst.validate.isNumOrEn))
    } else {
      callback()
    }
  }
}

/* 验证输入内容是否存在特殊字符 */
validate.isSpecialCharacters = function (rule, value, callback) {
  const reg = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？%+-]")
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (reg.test(value)) {
      callback(new Error(messagesConst.validate.isSpecialCharacters))
    } else {
      callback()
    }
  }
}

/* 验证输入内容是否存在特殊字符-组织 */
validate.isSpecialCharactersOrg = function (rule, value, callback) {
  const reg = new RegExp("[`~!@#$^*=|{}:;\\[\\]<>《》/?~！@#￥……*|{}【】；：”“。、？%+]")
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (reg.test(value)) {
      callback(new Error(messagesConst.validate.isSpecialCharacters))
    } else {
      callback()
    }
  }
}

/* 验证输入内容是否存在特殊字符-职位名称，菜单名称特殊处理 */
validate.isSpecialCharactersPosition = function (rule, value, callback) {
  const reg = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>《》?~！@#￥……&*（）——|{}【】‘；：”“'。，、？%+-]")
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (reg.test(value)) {
      callback(new Error(messagesConst.validate.isSpecialCharacters))
    } else {
      callback()
    }
  }
}

/* 验证输入空格提示输入项不能为空 */
validate.isSpecial = function (rule, value, callback) {
  // 判断是否为字符串
  if (typeof (value) == 'string') {
    value = value.trim()
  }
  if (value === '' || value === undefined || value === null) {
    callback(new Error(messagesConst.validate.required))
  } else {
    callback()
  }
}

/* 自动检验数值的范围 */
validate.checkMax20000 = function (rule, value, callback) {
  if (value === '' || value === undefined || value == null) {
    callback()
  } else if (!Number(value)) {
    callback(new Error(messagesConst.validate.checkMax20000))
  } else if (value < 1 || value > 20000) {
    callback(new Error(messagesConst.validate.checkMax20000))
  } else {
    callback()
  }
}

// 验证数字输入框最大数值,32767
validate.checkMaxVal = function (rule, value, callback) {
  if (value < 0 || value > 32767) {
    callback(new Error(messagesConst.validate.checkMaxVal))
  } else {
    callback()
  }
}
// 验证是否1-99之间
validate.isOneToNinetyNine = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.positiveInteger))
    } else {
      const re = /^[1-9][0-9]{0,1}$/
      const rsCheck = re.test(value)
      if (!rsCheck) {
        callback(new Error(messagesConst.validate.isOneToNinetyNine))
      } else {
        callback()
      }
    }
  }, 0)
}

// 验证是否数字
validate.isNum = function (rule, value, callback) {
  const reg = /^[0-9]*$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value)) {
      callback(new Error(messagesConst.validate.validateIsNum))
    } else {
      callback()
    }
  }
}

// 验证是否整数
validate.isInteger = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.positiveInteger))
    } else {
      const re = /^[0-9]*[1-9][0-9]*$/
      const rsCheck = re.test(value)
      if (!rsCheck) {
        callback(new Error(messagesConst.validate.positiveInteger))
      } else {
        callback()
      }
    }
  }, 0)
}
// 验证是否整数,非必填
validate.isIntegerNotMust = function (rule, value, callback) {
  if (!value) {
    callback()
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.positiveInteger))
    } else {
      const re = /^[0-9]*[1-9][0-9]*$/
      const rsCheck = re.test(value)
      if (!rsCheck) {
        callback(new Error(messagesConst.validate.positiveInteger))
      } else {
        callback()
      }
    }
  }, 1000)
}

// 验证是否是[0-1]的小数
validate.isDecimal = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.isDecimal))
    } else {
      if (value < 0 || value > 1) {
        callback(new Error(messagesConst.validate.isDecimal))
      } else {
        callback()
      }
    }
  }, 100)
}

// 验证是否是[1-10]的小数,即不可以等于0
validate.isBtnOneToTen = function (rule, value, callback) {
  if (value === undefined) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.isBtnOneToTen))
    } else {
      if (!(value === 1 || value === 2 || value === 3 || value === 4 || value === 5 || value === 6 || value === 7 || value === 8 || value === 9 || value === 10)) {
        callback(new Error(messagesConst.validate.isBtnOneToTen))
      } else {
        callback()
      }
    }
  }, 100)
}
// 验证是否是[1-100]的小数,即不可以等于0
validate.isBtnOneToHundred = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.isBtnOneToHundred))
    } else {
      if (value < 1 || value > 100) {
        callback(new Error(messagesConst.validate.isBtnOneToHundred))
      } else {
        callback()
      }
    }
  }, 100)
}
// 验证是否是[0-100]的小数
validate.isBtnZeroToHundred = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error(messagesConst.validate.isBtnZeroToHundred))
    } else {
      if (value < 0 || value > 100) {
        callback(new Error(messagesConst.validate.isBtnZeroToHundred))
      } else {
        callback()
      }
    }
  }, 100)
}

// 验证端口是否在[0,65535]之间
validate.isPort = function (rule, value, callback) {
  if (!value) {
    return callback(new Error(messagesConst.validate.notNull))
  }
  setTimeout(() => {
    if (value === '' || value === undefined) {
      callback(new Error(messagesConst.validate.isPortNotNull))
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
      const rsCheck = re.test(value)
      if (!rsCheck) {
        callback(new Error(messagesConst.validate.isPort))
      } else {
        callback()
      }
    }
  }, 100)
}
// 验证端口是否在[0,65535]之间，非必填,isMust表示是否必填
validate.isCheckPort = function (rule, value, callback) {
  if (!value) {
    callback()
  }
  setTimeout(() => {
    if (value === '' || value === undefined) {
      // callback(new Error('请输入端口值'));
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
      const rsCheck = re.test(value)
      if (!rsCheck) {
        callback(new Error(messagesConst.validate.isCheckPort))
      } else {
        callback()
      }
    }
  }, 100)
}

/* 小写字母 */
validate.validateLowerCase = function (str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}
/* 保留2为小数 */
validate.validatetoFixedNew = function (str) {
  return str
}
/* 验证key */
// validate. = function validateKey(str) {
//     var reg = /^[a-z_\-:]+$/;
//     return reg.test(str);
// }

/* 大写字母 */
validate.validateUpperCase = function (str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/* 大小写字母 */
validate.validatAlphabets = function (str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * 邮箱
 * @param {*} s
 */
export function isEmail(s) {
  return /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((\.+[a-zA-Z0-9_-]{2,64}){1,3})$/.test(s)
}
validate.validateEmail = function (rule, value, callback) {
  if (value && !isEmail(value)) {
    callback(new Error(messagesConst.validate.validateEMail))
  } else {
    callback()
  }
}
/**
 * 手机号码
 * @param {*} s
 */
export function isMobile(s) {
  return /^(?:13\d|15\d|16\d|17\d|18\d|19\d)\d{5}(\d{3}|\*{3})$/.test(s)
}
validate.validateMobile = function (rule, value, callback) {
  if (value && !isMobile(value)) {
    callback(new Error(messagesConst.validate.validateMobile))
  } else {
    callback()
  }
}
/**
 * 电话号码
 * @param {*} s
 */
export function isPhone(s) {
  return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
}
/* 是否手机号码 */
validate.validatePhone = function (rule, value, callback) {
  if (value && !isPhone(value)) {
    callback(new Error(messagesConst.validate.validateMobile))
  } else {
    callback()
  }
}
/**
 * URL地址
 * @param {*} s
 */
validate.isURL = function (s) {
  return /^http[s]?:\/\/.*/.test(s)
}
export function isURL(s) {
  return /^http[s]?:\/\/.*/.test(s)
}
/**
 * 身份证号码
 * @param s
 * @returns {*|boolean}
 */
export function idCard(s) {
  return /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/.test(s)
}
validate.validateIdCard = function (rule, value, callback) {
  if (value && !idCard(value)) {
    callback(new Error(messagesConst.validate.validateIdNo))
  } else {
    callback()
  }
}
/**
 * 正整数校验
 * @param s
 * @returns {*|boolean}
 */
validate.validateSort = function (rule, value, callback) {
  if (value && !(/^[1-9]\d*|0$/.test(value))) {
    callback(new Error(messagesConst.validate.positiveInteger))
  } else {
    callback()
  }
}
/**
 * 验证空数组或空串
 */
validate.emptyArray = function (rule, value, callback) {
  if (value === '') {
    callback(new Error(messagesConst.validate.required))
  } else if (value.length === 0) {
    callback(new Error(messagesConst.validate.required))
  } else {
    callback()
  }
}
export default validate
